    <!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<meta name="author" content="nodejh">
		<meta name="description" content="Describe your website">
		<meta name="generator" content="Hugo 0.16" />
		<title>Troubleshoot MySQL Start Error &middot; nodejh</title>
		<link rel="shortcut icon" href="http://nodejh.com/images/favicon.ico">
		<link rel="stylesheet" href="http://nodejh.com/css/style.css">
		
		<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/atom-one-light.min.css">
		

		
		<link rel="stylesheet" href="http://nodejh.com/fontawesome/css/font-awesome.min.css">
		

		
		<link href="http://nodejh.com/index.xml" rel="alternate" type="application/rss+xml" title="nodejh" />
		
	</head>

    <body>
       <nav class="main-nav">
	
	
		<a href='http://nodejh.com/'> <span class="arrow">←</span>Home</a>
	

	
		<a href='http://nodejh.com/post'>Archive</a>
	

	
		<a href='http://nodejh.com/about'>About</a>
	

	
	<a class="cta" href="http://nodejh.com/index.xml">Subscribe</a>
	
</nav>


        <section id="wrapper">
            <article class="post">
                <header>
                    <h1>Troubleshoot MySQL Start Error</h1>
                    <h2 class="headline">
                    Jul 31, 2016 17:05
                    · 713 words
                    · 4 minutes read
                      <span class="tags">
                      
                      
                          
                              <a href="http://nodejh.com/tags/mysql">MySQL</a>
                          
                      
                      
                      </span>
                    </h2>
                </header>
                <section id="post-body">
                    

<p>今天使用 MySQL 的时候，莫名奇妙除了很多问题。在 Google 和 StackOverflow 搜索了一大堆，也没有找到很好解决办法。Anyway，最终机智的我还是把问题解决。</p>

<p>在此记录下整个排错过程。</p>

<h4 id="0-系统环境">0. 系统环境</h4>

<ul>
<li>操作系统 OS X EI Caption 10.11.6 (15G31)</li>
<li>MySQL 5.7.13</li>
<li><code>/usr/local/mysql/bin</code> 和 <code>/usr/local/mysql/support-files</code> 都已经加入到了系统环境变量</li>
</ul>

<h4 id="1-进入-mysql-控制台报错">1. 进入 MySQL 控制台报错</h4>

<pre><code># 使用 mysql 命令进入 mysql 控制台
$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
</code></pre>

<p>出现这个错误，第一时间想到的原因就是 MySQL 并没有启动。为了验证这个猜测，所以我们接下来看看 MySQL 的运行情况。</p>

<pre><code>$ mysql.server status
/usr/local/mysql/support-files/mysql.server: line 365: pidof: command not found
 ERROR! MySQL is not running
</code></pre>

<p>可以发现， MySQL 没有运行。</p>

<p>这里使用的是 <code>mysql.server status</code> 命令来查看 MySQL 的运行状态。如果你没有将该命令加入到系统环境变量，则需要加上相应的路径才行，不然会有类似于 <code>zsh: command not found: mysql.server</code> 的错误，也就是说，没有这个命令。</p>

<p>如果没有将 MySQL 相应命令加入系统环境变量，一般需要这么来启动 MySQL：<code>/usr/local/mysql/support-files/mysql.server status</code>，进入 MySQL 控台则需要这样：<code>/usr/local/mysql/bin/mysql -uroot -p</code>。也就是在 <code>mysql.server</code> 或 <code>mysql</code> 等命令前加上路径。</p>

<h4 id="2-mysql-启动报错">2. MySQL 启动报错</h4>

<p>既然 MySQL 没有运行，那么我们肯定要启动 MySQL。</p>

<pre><code>$ mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/mysql/data/jh.local.pid).
$ mysql.server status
/usr/local/mysql/support-files/mysql.server: line 365: pidof: command not found
 ERROR! MySQL is not running
</code></pre>

<p>启动报错了。会不会是权限不够呢？于是我们再试试使用 <code>sudo</code> 来启动 MySQL：</p>

<pre><code>Starting MySQL
...........................
</code></pre>

<p><code>...</code> 一直在增长，MySQL 一直是正在启动，但就是无法启动成功。</p>

<h4 id="3-排查-mysql-启动报错原因">3. 排查 MySQL 启动报错原因</h4>

<p>既然 MySQL 启动报错了，那么我们可以通过查看一些日志来推断 MySQL 的报错原因。
在 MySQL 的安装目录里面，有一个 <code>data</code> 目录 （<code>/usr/local/mysql/data</code>），这里吗有一个名为 <code>your_computer_name.local.err</code> 的文件（例如我的该文件名为 <code>jh.local.err</code> ），这个文件里面记录了 MySQL 启动的详细日志信息。</p>

<p>为了更准地得到我们想要的信息，我们可以先删掉改文件，然后再启动 MySQL。</p>

<pre><code>$ sudo rm /usr/local/mysql/data/jh.local.err
$ sudo mysql.server start
Starting MySQL
..................
# 然后 Ctrl+C 停止进程
</code></pre>

<p>这个时候，再来看看 <code>jh.local.err</code> 里面的内容：</p>

<pre><code>$ sudo tail /usr/local/mysql/data/jh.local.err
2016-07-31T15:31:35.414440Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
2016-07-31T15:31:35.414531Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2016-07-31T15:31:36.417804Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
2016-07-31T15:31:36.418940Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2016-07-31T15:31:37.422609Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
2016-07-31T15:31:37.422654Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2016-07-31T15:31:38.427437Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
2016-07-31T15:31:38.427670Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2016-07-31T15:31:39.431165Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
2016-07-31T15:31:39.431205Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.

</code></pre>

<p>第一行就出现了 <code>[ERROR] InnoDB: Unable to lock ./ibdata1 error: 35</code>。然后第二行有个 <code>[Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.</code>。</p>

<p>大概意思就是，启动 MySQL 的进程无法给 <code>ibdata1</code> 这个文件加锁。可能是因为有其他 <code>mysqld</code> 进程已经在使用该文件了。</p>

<p>然后后面一直重复这两行。所以我们大概可以猜测，当我们使用 <code>sudo mysql.server start</code> 这个命令来启动 MySQL 的时候，MySQL 一直在尝试启动，但由于进程占用，一直无法启动成功。</p>

<h4 id="4-查看-mysqld-进程">4. 查看 mysqld 进程</h4>

<p>既然可能是 <code>mysqld</code> 进程已经启动，那么就列出 <code>mysqld</code> 的进程看看：</p>

<pre><code>$ ps xa | grep mysqld
8238   ??  Ss     0:03.74 /usr/local/mysql/bin/mysqld --user=_mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/mysqld.local.err --pid-file=/usr/local/mysql/data/mysqld.local.pid
10291 s003  R+     0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn mysqld
</code></pre>

<p>果然是有进程启动了，那么我们结束该进程，再重新启动 MySQL  试试：</p>

<pre><code>$ sudo kill 8238
$ sudo mysql.server start
Starting MySQL
..................
</code></pre>

<p>然而还是和之前一样的情况。再看看进程启动情况？</p>

<pre><code>10341   ??  Ss     0:00.38 /usr/local/mysql/bin/mysqld --user=_mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/mysqld.local.err --pid-file=/usr/local/mysql/data/mysqld.local.pid
10343 s003  R+     0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn mysqld
</code></pre>

<p><code>mysqld</code> 的进程依然存在，只是进程 ID 由之前的 <code>8238</code> 变成了 <code>10341</code>。多试几次，就会发现，当我们 kill 掉 <code>mysqld</code> 的进程后，它会自动重启。</p>

<h4 id="5-查看进程占用文件">5. 查看进程占用文件</h4>

<p>为了弄清楚已经启动的 <code>mysqld</code> 进程到底是为什么重启，我们可以先看看进程打开了哪些文件。</p>

<pre><code>$ lsof -c mysqld
</code></pre>

<p>什么都没有。<code>lsof</code> 只会列出当前用户启动的进程打开的文件。那么加上 <code>sudo</code> 试试？</p>

<pre><code>$ sudo lsof -c mysqld
COMMAND   PID   USER   FD     TYPE             DEVICE  SIZE/OFF     NODE NAME
mysqld  10634 _mysql  cwd      DIR                1,4       510 38686058 /usr/local/mysql-5.7.13-osx10.11-x86_64/data
mysqld  10634 _mysql  txt      REG                1,4  30794000 38685611 /usr/local/mysql-5.7.13-osx10.11-x86_64/bin/mysqld
mysqld  10634 _mysql  txt      REG                1,4    643792 38194604 /usr/lib/dyld
mysqld  10634 _mysql  txt      REG                1,4 558201098 39151946 /private/var/db/dyld/dyld_shared_cache_x86_64h
mysqld  10634 _mysql    0r     CHR                3,2       0t0      302 /dev/null
mysqld  10634 _mysql    1w     REG                1,4     71906 39198339 /usr/local/mysql-5.7.13-osx10.11-x86_64/data/mysqld.local.err
mysqld  10634 _mysql    2w     REG                1,4     71906 39198339 /usr/local/mysql-5.7.13-osx10.11-x86_64/data/mysqld.local.err
mysqld  10634 _mysql    3u  KQUEUE                                       count=0, state=0xa
.......
</code></pre>

<p>果然 <code>mysqld</code> 打开了很多文件！说明 <code>mysqld</code> 这个进程真实存在，并且占用了 MySQL 文件，而且是以 <code>root</code> 权限运行的。</p>

<h4 id="6-mysql-到底为何而启动">6. MySQL 到底为何而启动</h4>

<p>继续推断，<code>root</code> 权限启动，并且自动重启，那估计和系统启动有关了。</p>

<p>在 Linux 系统下，<code>/etc/rc.*</code> 或者 <code>/etc/init</code> 目录下包含着系统里各个服务启动和停止的脚本，而 OS X 中则是由 <code>launchd</code> 做进程的管理和控制。</p>

<p><code>launchd</code>  是OS X 从 10.4开始引入，用于用于初始化系统环境的关键进程，它是内核装载成功之后在OS环境下启动的第一个进程。采用这种方式配置启动进程，只需要一个 <code>plist</code> 文件。<code>/Library/LaunchDaemons</code> 目录下的 <code>plist</code> 文件都是系统启动后立即启动进程。使用 <code>launchctl</code> 命令加载/卸载 <code>plist</code> 文件，加载配置文件后，程序启动，卸载配置文件后程序关闭。</p>

<p>进入 <code>/Library/LaunchDaemons</code> 查看一下，确实是有一个和 MySQL 相关的 <code>plist</code> 文件 <code>com.oracle.oss.mysql.mysqld.plist</code>。</p>

<p>那么卸载该文件，然后再查看进程，验证是不是因为该 <code>plist</code>，所以 <code>mysqld</code> 才会不断重启：</p>

<pre><code>$ sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
</code></pre>

<p>查看进程：</p>

<pre><code>$ ps xa | grep mysqld
10924 s005  S+     0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn mysqld
</code></pre>

<p>果然 <code>mysqld</code> 进程已经不存在了。说明推测是正确的，<code>mysqld</code> 之所以会以 <code>root</code> 权限启动，就是因为有一个启动 <code>mysqld</code> 的 <code>plist</code> 配置文件。</p>

<p>因为是修通了系统的进程启动管理配置，所以需要重启一下，<code>launchd</code> 才会在下次启动中生效。</p>

<p>重启后，再通过 <code>mysql.server</code>  来启动 MySQL，就会发现一切正常了！</p>

<pre><code>$ sudo mysql.server start
Password:
Starting MySQL
. SUCCESS!
</code></pre>

<h4 id="7-总结">7. 总结</h4>

<p>加载 <code>plist</code> 配置的命令：</p>

<pre><code>$ sudo launchctl load -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
</code></pre>

<p>卸载 <code>plist</code> 配置的命令：</p>

<pre><code>$ sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
</code></pre>

<p>所以折腾了那么久，其实就只是因为 OS X 特殊的启动管理机制造成的 <code>mysqld</code> 自动启动并占用进程，造成我们期望的 MySQL 启动方式没有正常运行。</p>

<p>卸载掉 <code>plsit</code> 配置并重启系统就好了！</p>

                </section>
            </article>

            <div id="disqus_thread"></div>
<div style="margin-top: 50px">
  评论: 请点击 Gtihub Issue 链接跳转到评论页面
</div>
</div>


            <footer id="footer">
    
        <div id="social">

	
	
    <a class="symbol" href="https://www.facebook.com/nodejh">
        <i class="fa fa-facebook-square"></i>
    </a>
    
    <a class="symbol" href="https://www.github.com/nodejh">
        <i class="fa fa-github"></i>
    </a>
    
    <a class="symbol" href="http://stackoverflow.com/users/4518882/nodejh">
        <i class="fa fa-stack-overflow"></i>
    </a>
    
    <a class="symbol" href="https://www.twitter.com/nodejh">
        <i class="fa fa-twitter"></i>
    </a>
    


</div>

    
    <p class="small">
    
        © Copyright 2016 <i class="fa fa-heart" aria-hidden="true"></i> nodejh
    
    </p>
</footer>

        </section>

        <script   src="https://code.jquery.com/jquery-2.2.4.js" integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI="   crossorigin="anonymous"></script>
<script src="http://nodejh.com/js/main.js"></script>

<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>




<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-84989670-1', 'auto');
ga('send', 'pageview');
</script>


    </body>
</html>
